package com.algorithm.ch1.cjm.math;

/**
 * 罗马数字转整数
 * <p>
 * 罗马数字包含以下七种字符：I， V， X， L，C，D 和 M。
 * <p>
 * 字符          数值
 * I             1
 * V             5
 * X             10
 * L             50
 * C             100
 * D             500
 * M             1000
 * <p>
 * I 可以放在 V (5) 和 X (10) 的左边，来表示 4 和 9。
 * X 可以放在 L (50) 和 C (100) 的左边，来表示 40 和 90。
 * C 可以放在 D (500) 和 M (1000) 的左边，来表示 400 和 900。
 * <p>
 * 给定一个罗马数字，将其转换成整数。输入确保在 1 到 3999 的范围内。
 *
 * @Author: Jie Ming Chen
 * @Date: 2018/9/13
 * @Version 1.0
 */
public class RomanToInt {

    public static void main(String[] args) {

        String str = "MMMCMXCIX";
        int res = new RomanToInt().romanToInt(str);

        System.out.println(res);

    }

    /**
     * 怎么表示  3999
     * MMMCMXCIX
     * @param s
     * @return
     */
    public int romanToInt(String s) {

        int length = s.length();
        int index = 0;
        int count = 0;
        while (index < length) {

            boolean isFlag = index + 2 < length + 1;
            int val = 0;
            if (isFlag) {
                String str = s.substring(index, index + 2);
                val = getVal(str);
            }

            if (isFlag && val != 0) {
                count += val;
                index += 2;
            } else {

                String str1 = s.substring(index, index + 1);

                Integer val1 = getVal(str1);
                count += val1;
                index += 1;
            }
        }

        return count;
    }

    private int getVal(String str) {

        switch (str) {
            case "IV" :
                return 4;
            case "IX" :
                return 9;
            case "XL" :
                return 40;
            case "XC" :
                return 90;
            case "CD" :
                return 400;
            case "CM" :
                return 900;
            case "I" :
                return 1;
            case "V" :
                return 5;
            case "X" :
                return 10;
            case "L" :
                return 50;
            case "C" :
                return 100;
            case "D" :
                return 500;
            case "M" :
                return 1000;
                default:
                return 0;
        }
    }
}
